package com.macaline.util;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

/**
 * 关于文件处理的工具类
 * @author warm_joy
 */
public class FileUtils {
	
	
	/**
	 * 删除文件或者文件夹
	 * @author warm_joy
	 * @param file 删除的文件
	 * @param keepDirectory
	 * @return 文件夹操作 flase：删除文件夹 true：清空文件夹
	 */
	public boolean deleteFile(File file, boolean keepDirectory) {
		// 如果是文件直接删除
		if(file.isFile()) {
			file.delete();
			return true;
		}
		// 文件夹进行递归删除
		deleteDirectory(file, keepDirectory);
		return true;
	}
	
	/**
	 * 删除文件夹或者清空文件夹
	 * @author warm_joy
	 * @param file 需要清空的文件夹
	 * @param keepDirectory 是否保留当前文件夹 true：保留当前 false：不保留
	 */
	public static void deleteDirectory(File file, boolean keepDirectory) {
		// 删除子文件夹
		File[] childFile = file.listFiles();
		File nowfile;
		for (int i = 0; i < childFile.length; i++) {
			nowfile = childFile[i];
			//如果是文件夹进行递归删除
			if(nowfile.getName().endsWith(File.separator) || nowfile.isDirectory()) {
				deleteDirectory(nowfile, false);
			}else {
				// 是文件直接删除
				nowfile.delete();
			}
		}
		// 是否删除当前的文件夹
		if(!keepDirectory) {
			file.delete();
		}
	}
	/**
	 * 通过url下载文件
	 * @author warm_joy
	 * @param urlStr 文件下载的url
	 * @param fileName  下载到本地之后的文件名
	 * @param savePath  下载保存的路径
	 * @throws IOException
	 */
	public static void  downLoadFromUrl(String urlStr,String fileName,String savePath) throws IOException{
	    URL url = new URL(urlStr);
	    HttpURLConnection conn = (HttpURLConnection)url.openConnection();
	    //设置超时间为3秒
	    conn.setConnectTimeout(3*1000);
	    //防止屏蔽程序抓取而返回403错误
	    conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");

	    //得到输入流
	    InputStream inputStream = conn.getInputStream();
	    //获取自己数组
	    byte[] getData = readInputStream(inputStream);

	    //文件保存位置
	    File saveDir = new File(savePath);
	    if(!saveDir.exists()){
	        saveDir.mkdirs();
	    }
	    //创建本地下载文件
	    File file = new File(saveDir + File.separator + fileName);
	    //创建文件输出流
	    FileOutputStream fos = new FileOutputStream(file);
	    //对文件写入数据
	    fos.write(getData);
	    if(fos!=null){
	        fos.close();
	    }
	    if(inputStream!=null){
	        inputStream.close();
	    }
	    System.out.println("info:"+url+" download success");
	}

	/**
	 * 
	* <p>@author warm_joy </p>
	* <p>Description: </p>
	* <p>Date: 2019-07-17 16:25</p>
	* @param inputStream 
	* @return
	* @throws IOException
	 */
	/**
	 * 将需要下载文件的数据缓存起来
	 * @author warm_joy
	 * @param inputStream 下载文件的输入流
	 * @return 文件缓存的流
	 * @throws IOException
	 */
	public static  byte[] readInputStream(InputStream inputStream) throws IOException {
	    byte[] buffer = new byte[1024];
	    int len = 0;
	    ByteArrayOutputStream bos = new ByteArrayOutputStream();
	    //将读取的数据缓存到一个数组中
	    while((len = inputStream.read(buffer)) != -1) {
	        bos.write(buffer, 0, len);
	    }
	    bos.close();
	    return bos.toByteArray();
	}
	
	/**
	 * 
	* <p>@author warm_joy </p>
	* <p>Description: </p>
	* <p>Date: 2019-07-17 10:01</p>
	* @param oldPath 
	* @param newPath 
	* @throws IOException
	 */
	/**
	 * 复制文件夹
	 * @author warm_joy
	 * @param oldPath 进行复制的文件路径
	 * @param newPath 复制新文件的文件路径
	 * @throws IOException
	 */
	@SuppressWarnings("static-access")
	public static void copyDir(String oldPath, String newPath) throws IOException {
		//得到需要复制的文件
        File file = new File(oldPath);
        //文件名称列表
        String[] filePath = file.list();
        //如果新文件不存在的创建文件夹
        if (!(new File(newPath)).exists()) {
            (new File(newPath)).mkdirs();
        }
        //循环遍历文件夹下的文件列表
        for (int i = 0; i < filePath.length; i++) {
        	//如果是文件夹
            if ((new File(oldPath + file.separator + filePath[i])).isDirectory()) {
                copyDir(oldPath  + file.separator  + filePath[i], newPath  + file.separator + filePath[i]);
            }
            //如果是文件
            if (new File(oldPath  + file.separator + filePath[i]).isFile()) {
                copyFile(oldPath + file.separator + filePath[i], newPath + file.separator + filePath[i]);
            }
        }
    }
	
	/**
	 * 
	* <p>@author warm_joy </p>
	* <p>Description: </p>
	* <p>Date: 2019-07-17 10:01</p>
	* @param oldPath 
	* @param newPath 复制到的目标文件路径
	* @throws IOException
	 */
	/**
	 * 复制文件
	 * @author warm_joy
	 * @param oldPath 需要复制的文件路径
	 * @param newPath 复制到的目标文件路径
	 * @throws IOException
	 */
	public static void copyFile(String oldPath, String newPath) throws IOException {
		//需要复制的文件
        File oldFile = new File(oldPath);
        //复制的新文件
        File file = new File(newPath);
        if(!file.exists()) {
        	file.createNewFile();
        }
        //旧文件输入流
        FileInputStream in = new FileInputStream(oldFile);
        //新文件输出流
        FileOutputStream out = new FileOutputStream(file);;

        byte[] buffer=new byte[1024];
        //进行文件内容的复制
        while((in.read(buffer)) != -1){
            out.write(buffer);
        }
        out.close();
        in.close();
	}

}
